﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MultiCola;

namespace Modelo
{
    public class Estacion
    {
        private Boolean CON_CUPO = true;
        private Boolean SIN_CUPO = false;        
        private string _nombre;
        private int _capacidad;
        private Boolean _estado ;
        private string _gpsX;
        private string _gpsY;
        private MultiCola<Pasajero> _pasajerosEstacion;
        private Queue<Pasajero> _pasajerosEnCola;
        private string[] _rutas;
        

        public Estacion(string nombre, int capacidad,string gpsX, string gpsY )
        {
            _nombre = nombre;
            _capacidad = capacidad;            
            _estado = CON_CUPO;
            _gpsX = gpsX;
            _gpsY = gpsY;
            _pasajerosEstacion = new MultiCola<Pasajero>(1);
            _pasajerosEnCola = new Queue<Pasajero>();
        }


        public int darPasajerosActivos()
        {
            return (_pasajerosEstacion.size() + _pasajerosEnCola.Count);
        }

        //cambia las rutas que pasan por una estacion modificando la multicola
        
        public void setRutas(string[] rutas)
        {
            _pasajerosEstacion = new MultiCola<Pasajero>(rutas.Length);
            _rutas = rutas;
        }

        public void reiniciarListas()
        {
            _pasajerosEstacion = new MultiCola<Pasajero>(_rutas.Length);
            _pasajerosEnCola.Clear();
        }

        public double darGpsX()
        {
            return double.Parse(_gpsX);
        }

        public double darGpsY()
        {
            return double.Parse(_gpsY);
        }

        public Boolean estado(){
            return _estado;
        }

        public void revisarFila()
        {
            if (_pasajerosEnCola.Count>0 && _estado)
            {
                ingresarPasajero(_pasajerosEnCola.Dequeue());
            }
        }

        public void ingresarPasajero(Pasajero pasajero)
        {           
            int capacidadEnUso = _pasajerosEstacion.size();
            if (_estado)
            {
                _pasajerosEstacion.enQueue(pasajero, 0);
            }
            else
            {
                _pasajerosEnCola.Enqueue(pasajero);
            }
            if (capacidadEnUso <= _capacidad)
            {
                _estado = SIN_CUPO;
            }
            else
            {
                _estado = CON_CUPO;
            }
        }

        /*
         * Se sabe que el pasajero dado por parametro es el que esta de primero en alguna
         * de las "filas de espera" de las rutas.
         */
        public void pasajeroSalio(Pasajero pasajero)
        {
            for (int contador = 0; contador < _pasajerosEstacion.colas(); contador++)
            {
                Pasajero temporal = _pasajerosEstacion.peek(contador);
                if (temporal.Equals(pasajero))
                {
                    _pasajerosEstacion.deQueue(contador);
                    break;
                }
            }
        }
       /*
        public void llegoBus(Bus bus)
        {            
                MultiCola<Pasajero> temporal = new MultiCola<Pasajero>(5);                
                int expected = _pasajerosEstacion.size();
                for (int j = 1; j <= _pasajerosEstacion.colas(); j++)
                {
                    for (int i = 0; i < 1000; i++)
                    {
                        Pasajero pasajeroTemporal = _pasajerosEstacion.deQueue(j);
                        pasajeroTemporal.llegoBus(bus);
                        temporal.enQueue(pasajeroTemporal, j);
                    }
                }
                _pasajerosEstacion = temporal;
                int actual = _pasajerosEstacion.size();            
        }
        */

        public void llegoBus(Bus bus)
        {
            
        }

        public string darNombre(){
            return _nombre;
        }

        public int definirPosicionMulticola(int ruta)
        {
            for (int i = 0; i < _rutas.Length; i++)
            {
                if (_rutas[i].Equals(ruta))
                {
                    return i;
                }
            }
            return -1;
        }

        public string[] getRutas()
        {
            return _rutas;
        }

    }
    ///Redifinir rutas...
}
